package net.jgrm.common.util;

import org.apache.commons.lang3.time.DateFormatUtils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

/**
 * 日期工具类
 * 继承 org.apache.commons.lang3.time.DateUtils 类
 *
 * @author service-common
 */
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {

    // 日期格式常量
    public static final String PATTERN_DATETIME = "yyyy-MM-dd HH:mm:ss";
    public static final String PATTERN_DATE = "yyyy-MM-dd";
    public static final String PATTERN_TIME = "HH:mm:ss";
    public static final String PATTERN_DATETIME_SHORT = "yyyy-MM-dd HH:mm";
    public static final String PATTERN_DATE_SHORT = "yyyyMMdd";
    public static final String PATTERN_MONTH_DAY = "MM-dd";

    private static final String[] PARSE_PATTERNS = {
            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm",
            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm",
            "yyyyMMdd", "yyyyMMddHHmmss"
    };

    /**
     * 私有构造函数
     */
    private DateUtils() {
        // 工具类不允许实例化
    }

    /**
     * 获取当前日期字符串，格式：yyyy-MM-dd
     *
     * @return 当前日期字符串
     */
    public static String getDate() {
        return getDate(PATTERN_DATE);
    }

    /**
     * 获取当前日期字符串，指定格式
     *
     * @param pattern 日期格式
     * @return 当前日期字符串
     */
    public static String getDate(String pattern) {
        return DateFormatUtils.format(new Date(), pattern);
    }

    /**
     * 格式化日期，默认格式：yyyy-MM-dd
     *
     * @param date    日期
     * @param pattern 格式（可选）
     * @return 格式化后的日期字符串
     */
    public static String formatDate(Date date, Object... pattern) {
        if (date == null) {
            return null;
        }
        String formatPattern = PATTERN_DATE;
        if (pattern != null && pattern.length > 0) {
            formatPattern = pattern[0].toString();
        }
        return DateFormatUtils.format(date, formatPattern);
    }

    /**
     * 格式化日期时间，格式：yyyy-MM-dd HH:mm:ss
     *
     * @param date 日期
     * @return 格式化后的日期时间字符串
     */
    public static String formatDateTime(Date date) {
        return formatDate(date, PATTERN_DATETIME);
    }

    /**
     * 获取当前时间字符串，格式：HH:mm:ss
     *
     * @return 当前时间字符串
     */
    public static String getTime() {
        return formatDate(new Date(), PATTERN_TIME);
    }

    /**
     * 获取当前日期时间字符串，格式：yyyy-MM-dd HH:mm:ss
     *
     * @return 当前日期时间字符串
     */
    public static String getDateTime() {
        return formatDate(new Date(), PATTERN_DATETIME);
    }

    /**
     * 获取当前年份字符串，格式：yyyy
     *
     * @return 当前年份字符串
     */
    public static String getYear() {
        return formatDate(new Date(), "yyyy");
    }

    /**
     * 获取当前月份字符串，格式：MM
     *
     * @return 当前月份字符串
     */
    public static String getMonth() {
        return formatDate(new Date(), "MM");
    }

    /**
     * 获取当天字符串，格式：dd
     *
     * @return 当天字符串
     */
    public static String getDay() {
        return formatDate(new Date(), "dd");
    }

    /**
     * 解析日期字符串
     *
     * @param str 日期字符串
     * @return 日期对象
     */
    public static Date parseDate(String str) {
        if (str == null) {
            return null;
        }
        try {
            return parseDate(str, PARSE_PATTERNS);
        } catch (ParseException e) {
            return null;
        }
    }

    /**
     * 字符串转换为毫秒数
     *
     * @param dateStr 日期字符串
     * @param pattern 日期格式
     * @return 毫秒数
     */
    public static Long str2Long(String dateStr, String pattern) {
        try {
            DateFormat dateFormat = new SimpleDateFormat(pattern);
            dateFormat.setLenient(false);
            return dateFormat.parse(dateStr).getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 毫秒数转换为字符串
     *
     * @param milltime 毫秒数
     * @param pattern  日期格式
     * @return 日期字符串
     */
    public static String long2Str(Long milltime, String pattern) {
        if (milltime == null) {
            return null;
        }
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(milltime);
        DateFormat dateFormat = new SimpleDateFormat(pattern);
        return dateFormat.format(cal.getTime());
    }

    /**
     * 获取当前时间的毫秒数
     *
     * @return 当前时间毫秒数
     */
    public static Long getCurrentTimeMillis() {
        return Calendar.getInstance(Locale.CHINA).getTimeInMillis();
    }

    /**
     * 计算两个日期之间的天数差
     *
     * @param start 开始日期
     * @param end   结束日期
     * @return 天数差
     */
    public static long daysBetween(Date start, Date end) {
        if (start == null || end == null) {
            return 0;
        }
        long startTime = start.getTime();
        long endTime = end.getTime();
        return (endTime - startTime) / (24 * 60 * 60 * 1000);
    }

    /**
     * 判断日期是否为今天
     *
     * @param date 日期
     * @return true:是今天 false:不是今天
     */
    public static boolean isToday(Date date) {
        if (date == null) {
            return false;
        }
        String today = formatDate(new Date(), PATTERN_DATE);
        String target = formatDate(date, PATTERN_DATE);
        return today.equals(target);
    }
}